import router from './router'
import store from './store'
import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/auth' // 从 cookie 获取 token
import getPageTitle from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // NProgress 配置

const whiteList = ['/login', '/login2', '/auth-redirect', '/download'] // 无需重定向的白名单

router.beforeEach(async (to, from, next) => {
  // 开始进度条
  NProgress.start()

  // 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 判断用户是否已登录
  const hasToken = getToken()

  if (hasToken) {
    if (to.path === '/login') {
      // 如果已登录，重定向到首页
      next({ path: '/' })
      NProgress.done() // 解决方法：https://github.com/PanJiaChen/vue-element-admin/pull/2939
    } else {
      // 判断用户是否已获取有效的权限角色
      // roles 必须是一个非空数组，且不包含空字符串、null 或 undefined
      const roles = store.getters.roles
      const hasValidRoles = Array.isArray(roles) && roles.length > 0 && roles.every(role => role !== '' && role !== null && role !== undefined)

      if (hasValidRoles) {
        next()
      } else {
        try {
          // 获取用户信息
          // 注意：roles 必须是一个对象数组！例如：['admin'] 或 ['developer','editor']
          const { roles } = await store.dispatch('user/getInfo')

          // 再次检查返回的 roles 是否有效
          const hasValidFetchedRoles = Array.isArray(roles) && roles.length > 0 && roles.every(role => role !== '' && role !== null && role !== undefined)
          if (!hasValidFetchedRoles) {
            throw new Error('无效的角色数据')
          }

          // 根据角色生成可访问的路由表
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          // 动态添加可访问路由
          router.addRoutes(accessRoutes)
          // 确保 addRoutes 已完成的解决方法
          // 设置 replace: true，这样导航不会留下历史记录
          next({ ...to, replace: true })
        } catch (error) {
          // 删除 token 并跳转到登录页面重新登录
          await store.dispatch('user/resetToken')
          // Message.error(error || '发生错误')
          next(`/login`)
          NProgress.done()
        }
      }
    }
  } else {
    /* 没有 token */

    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单中，直接进入
      next()
    } else {
      // 没有权限访问的其他页面，重定向到登录页面
      next(`/login`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 完成进度条
  NProgress.done()
})